/*
 * Copyright the original author or authors.
 */
package com.derbysoft.core;

import java.io.Serializable;


/**
 * <code>Paginator</code>,分页对象
 *
 * @author snowway
 * @since 2005-04-05
 */
public class Paginator implements Serializable {

    /**
     * serialVersionUID
     */
    private static final long serialVersionUID = 620814200992640712L;

    /**
     * 总记录数
     */
    protected int totalcount;


    /**
     * 每页显示记录数
     */
    private int count;


    /**
     * 当前请求页面 从第一页开始
     */
    private int page;

    /**
     *
     */
    private Paginator() {
    }

    /**
     * create Paginator by count,page and totalcount
     *
     * @param count      每页显示记录数
     * @param page       当前请求页面
     * @param totalcount 总记录数
     */
    public Paginator(int count, int page, int totalcount) {
        this();
        this.count = count;
        this.totalcount = totalcount;

        // 小于第一页
        if (page < 1) {
            this.page = 1;
        }
        // 大于最后一页
        else if (page > this.getLastPage()) {
            this.page = this.getLastPage();
        } else {
            this.page = page;
        }
    }


    /**
     * create Paginator by count and totalcount
     *
     * @param count      每页显示记录数
     * @param totalcount 总记录数
     */
    public Paginator(int count, int totalcount) {
        this(count, 1, totalcount);
    }


    /**
     * @return 总记录数
     */
    public int getTotalcount() {
        return this.totalcount;
    }


    /**
     * @return 得到总页面数量
     */
    public int getLastPage() {
        // 不足一页
        if (this.getTotalcount() < this.getCount()) {
            return 1;
        }
        int remainder = this.getTotalcount() % this.getCount();
        int quotient = this.getTotalcount() / this.getCount();
        return remainder == 0 ? quotient : quotient + 1;
    }

    /**
     * 到最后一页
     */
    public boolean last() {
        this.page = this.getLastPage();
        return true;
    }

    /**
     * @return 每页显示记录数
     */
    public int getCount() {
        return this.count;
    }

    /**
     * @return 当前页
     */
    public int getPage() {
        return this.page;
    }

    /**
     * 刷新
     */
    public boolean refresh() {
        return true;
    }

    /**
     * @return 下一页
     */
    public int getNextPage() {
        if (this.getPage() == this.getLastPage()) {
            return this.getLastPage();
        } else {
            return this.getPage() + 1;
        }
    }

    /**
     * @return 是否有下一页
     */
    public boolean isNextExists() {
        return this.getPage() != this.getLastPage();
    }


    /**
     * 到下一页
     *
     * @return
     */
    public boolean next() {
        if (this.isNextExists()) {
            this.page += 1;
            return true;
        }
        return false;
    }


    /**
     * 到第page页
     *
     * @param page
     * @return 是否导航成功 page如果在有效范围内返回true
     */
    public boolean toPage(int page) {

        if (page > this.getLastPage() || page < this.getFirstPage()) {
            return false;
        }

        this.page = page;
        return true;
    }

    /**
     * @return 上一页
     */
    public int getPreviousPage() {
        return this.getPage() == 1 ? 1 : this.getPage() - 1;
    }

    /**
     * @return 是否有上一页
     */
    public boolean isPreviousExists() {
        return this.getPage() != 1;
    }


    /**
     * 到前一页
     *
     * @return
     */
    public boolean previous() {
        if (this.isPreviousExists()) {
            this.page -= 1;
            return true;
        }

        return false;
    }

    /**
     * @return 第一页
     */
    public int getFirstPage() {
        return 1;
    }


    /**
     * 导航到第一页
     *
     * @return 是否导航成功
     */
    public boolean first() {
        this.page = 1;
        return true;
    }


    /**
     * 根据当前Paginator对象创建Limit
     *
     * @return
     */
    public Limit createLimit() {
        return new Limit((this.page - 1) * this.count, this.count);
    }

    /**
     * 总记录数发生变化，需要重新计算分页信息
     *
     * @param totalcount
     */
    public void totalcountChanged(int totalcount) {
        this.totalcount = totalcount;
    }
}
